package main

import (
	"bytes"
	"math"
	"strings"
)

// binaryFormat 将十进制数字（int64）转换为对应的64位二进制形式
func binaryFormat(n int64) string {
	c := int64(math.Pow(2, 31))
	var res strings.Builder
	for i := 0; i < 32; i++ {
		if n&c != 0 {
			res.WriteString("1")
		} else {
			res.WriteString("0")
		}
		c >>= 1
	}
	return res.String()
}

// encodeVint 将int64类型的数字，按照如下规则编码，输出编码后的数字（64位的int64将做多编码为8个uint8数字,byte是uint8的别名）
// 规则：依次取出低7位，如果剩余高位上还有1，则把第8位置为1；否则 第8位置为0，退出循环
func encodeVint(n int64) []byte {
	buffer := bytes.Buffer{}
	for n&^0x7F != 0 { //高位存在1
		buffer.WriteByte(byte((uint(n) & 0x7F) | 0x80))
		n >>= 7
	}

	buffer.WriteByte(byte(n)) //高位不存在1的，这里需要写入下
	return buffer.Bytes()
}

func decodeVint(bs []byte) int {
	var n int = 0
	shift := 0
	i := 0
	for ; (bs[i]&0x80) != 0 && i < 8; i++ {
		n |= int(bs[i]) & 0x7F << shift
		shift += 7
	}
	//第8位是0的，在这里写入
	n |= int(bs[i]) & 0x7F << shift
	return n
}
